/**
 * 用于EventList的监听事件方法接口
 */
export interface ProbeEvent{
    self : any;
    func : Function;
}

/**
 * 事件队列
 * 提供一个钩子，当钩子触发时调用所有注册的事件
 * 函数的参数是self(监听者自身)、eventData(事件的数据)
 */
export class ProbeEventList
{
    private eventList : Array<ProbeEvent> = new Array();

    /**
     * 注册事件
     * @param func 监听函数。函数的参数是self(监听者自身)、eventData(事件的数据)
     * @param self 监听者本身
     */
    public AddFunc(func:Function,self:any){
        var event : ProbeEvent = {
            self : self,
            func : func
        }

        this.eventList.push(event);
    }

    /**
     * 注销事件
     * @param func 监听函数。函数的参数是self(监听者自身)、eventData(事件的数据)
     * @param self 监听者本身
     */
    public RemoveFunc(func:Function,self:any){
        var event : ProbeEvent = null;
        for (let element of this.eventList) {
            if(element.self == self && element.func == func){
                event = element;
                break;
            }
        }

        this.eventList = this.eventList.filter((item)=>{item == event});
    }

    /**
     * 启动事件钩子
     * @param eventData 事件数据
     */
    public DoEvent(...eventData : Array<any>){
        for (let element of this.eventList) {
            element.func(element.self,eventData);
        }
    }

    /**
     * 清除所有订阅
     */
    public Clear(){
        this.eventList = [];
    }
}